Um ein PowerShell-Skript (oder "Makro") direkt im Windows Explorer auf ausgewählte Dateien anzuwenden, gibt es drei gängige Wege. Der effizienteste Weg für den Alltag ist das "Senden an"-Menü, da es keine tiefen Systemeingriffe erfordert.
Dies fügt dein Skript dem Rechtsklick-Menü hinzu.
Drücke Win + R, gib shell:sendto ein und bestätige mit Enter.
Klicke mit der rechten Maustaste in den Ordner und wähle Neu > Verknüpfung.
Gib als Speicherort folgendes ein: powershell.exe -NoExit -File "C:\Pfad\Zu\Deinem\Skript.ps1" (Ersetze den Pfad durch den tatsächlichen Ort deines Skripts. -NoExit lässt das Fenster offen, damit du Fehler sehen kannst).
Gib der Verknüpfung einen Namen (z. B. "Mein Makro").
Anwendung: Markiere Dateien im Explorer > Rechtsklick > Senden an > Mein Makro.
Wenn du das Skript direkt unter der ersten Ebene des Rechtsklick-Menüs haben möchtest, musst du die Registry nutzen.
Drücke Win + R, gib regedit ein.
Navigiere zu: HKEY_CLASSES_ROOT\*\shell (Das * steht für alle Dateitypen).
Rechtsklick auf shell > Neu > Schlüssel. Nenne ihn z. B. "PowerShellMakro".
Rechtsklick auf den neuen Schlüssel > Neu > Schlüssel. Nenne diesen zwingend command.
Doppelklick rechts auf (Standard) und gib den Befehl ein: powershell.exe -File "C:\Pfad\DeinSkript.ps1" "%1" Das %1 ist der Platzhalter für die ausgewählte Datei.
Damit dein Skript weiß, welche Dateien du markiert hast, nutzt es die Variable $args. Hier ist ein einfaches Beispiel für dein .ps1-Skript:
PowerShell
# Verarbeitet jede Datei, die übergeben wurde
foreach ($file in $args) {
Write-Host "Verarbeite Datei: $file"
# Hier kommt dein eigentlicher Code hin, z.B.:
# Rename-Item -Path $file -NewName ($file + ".bak")
}
Write-Host "Fertig!"
pause# Verarbeitet jede Datei, die übergeben wurde
foreach ($file in $args) {
Write-Host "Verarbeite Datei: $file"
# Hier kommt dein eigentlicher Code hin, z.B.:
# Rename-Item -Path $file -NewName ($file + ".bak")
}
Write-Host "Fertig!"
pauseStandardmäßig blockiert Windows das Ausführen von Skripten. Falls dein Makro nicht startet, öffne die PowerShell als Administrator und gib diesen Befehl ein: Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Force
| Methode | Schwierigkeit | Vorteil |
|---|---|---|
| Senden an | Leicht | Sicher, schnell eingerichtet, keine Registry-Gefahr. |
| Kontextmenü | Mittel | Schnellerer Zugriff (weniger Klicks). |
| PowerShell-Profil | Schwer | Gut für Experten, aber kein direkter Explorer-Rechtsklick. |
In Google Sheets exportieren
Möchtest du, dass ich dir ein spezifisches PowerShell-Skript schreibe, das eine bestimmte Aufgabe mit den markierten Dateien erledigt (z. B. Umbenennen, Verschieben oder Komprimieren)?
Du hast gesagt
ja, ich brauche ein script, das einem dateinamen ab der 10.Stelle den Begriff "Archiv" einfügt!
Das ist ein klassischer Anwendungsfall für die String-Manipulation in PowerShell. Damit das Skript robust funktioniert, müssen wir sicherstellen, dass es nur Dateien bearbeitet, die überhaupt lang genug sind (mindestens 10 Zeichen), um Fehler zu vermeiden.
Hier ist das fertige Skript für dein Vorhaben:
Archiv-Makro.ps1)Kopiere diesen Code in eine Textdatei und speichere sie als Archiv-Makro.ps1 ab:
PowerShell
foreach ($path in $args) {
# Basisdaten der Datei abrufen
$file = Get-Item -LiteralPath $path
# Prüfen, ob es eine Datei ist (kein Ordner)
if ($file -is [System.IO.FileInfo]) {
$name = $file.BaseName # Dateiname ohne Endung
$ext = $file.Extension # Dateiendung (z.B. .txt)
# Prüfen, ob der Name lang genug ist (mind. 10 Stellen)
if ($name.Length -ge 10) {
# String zerlegen: Von 0 bis 10, dann "Archiv", dann der Rest
$newName = $name.Insert(10, "Archiv") + $ext
# Pfad für die Umbenennung zusammenbauen
$newPath = Join-Path -Path $file.DirectoryName -ChildPath $newName
# Umbenennen (ErrorAction SilentlyContinue verhindert Fehler bei Duplikaten)
Rename-Item -LiteralPath $path -NewName $newName -ErrorAction SilentlyContinue
}
}
}foreach ($path in $args) {
# Basisdaten der Datei abrufen
$file = Get-Item -LiteralPath $path
# Prüfen, ob es eine Datei ist (kein Ordner)
if ($file -is [System.IO.FileInfo]) {
$name = $file.BaseName # Dateiname ohne Endung
$ext = $file.Extension # Dateiendung (z.B. .txt)
# Prüfen, ob der Name lang genug ist (mind. 10 Stellen)
if ($name.Length -ge 10) {
# String zerlegen: Von 0 bis 10, dann "Archiv", dann der Rest
$newName = $name.Insert(10, "Archiv") + $ext
# Pfad für die Umbenennung zusammenbauen
$newPath = Join-Path -Path $file.DirectoryName -ChildPath $newName
# Umbenennen (ErrorAction SilentlyContinue verhindert Fehler bei Duplikaten)
Rename-Item -LiteralPath $path -NewName $newName -ErrorAction SilentlyContinue
}
}
}Da wir das Skript gerade besprochen haben, hier die schnellste Einrichtung:
Drücke Win + R und gib shell:sendto ein.
Rechtsklick im Ordner -> Neu -> Verknüpfung.
Gib folgendes als Ziel ein (Pfade anpassen!): powershell.exe -WindowStyle Hidden -File "C:\DeinPfad\Archiv-Makro.ps1" (Der Zusatz -WindowStyle Hidden sorgt dafür, dass das schwarze Fenster nur ganz kurz aufblitzt).
Nenne die Verknüpfung "Dateinamen archivieren".
.Insert(10, "Archiv"): In PowerShell beginnt die Zählung bei 0. Das bedeutet, .Insert(10, ...) fügt den Text exakt nach dem 10. Zeichen ein.
Beispiel: EinsZweiDreiVier.txt (17 Zeichen)
Ergebnis: EinsZweiDrArchiveiVier.txt
BaseName & Extension: Das Skript trennt den Namen von der Endung. So verhinderst du, dass das Wort "Archiv" versehentlich in die Dateiendung (z.B. .arcarchivtxt) geschoben wird, falls der Name sehr kurz ist.
LiteralPath: Dies ist wichtig, falls deine Dateinamen eckige Klammern [] enthalten, die PowerShell sonst als Sonderzeichen interpretieren würde.
Ein kleiner Tipp: Wenn du das Wort "Archiv" lieber mit einem Trennzeichen einfügen willst (z.B. _Archiv_), ändere einfach die Zeile im Skript zu: $newName = $name.Insert(10, "_Archiv_") + $ext
Soll ich das Skript so erweitern, dass es zusätzlich ein Log-File schreibt, damit du später sehen kannst, welche Dateien umbenannt wurden?
Du hast gesagt
ok, danke, hast Du auch noch einscript, das dem dateinamen das erstellungsdatum der datei im iso-format voranstellt?
Das lässt sich sehr gut mit dem vorherigen Skript kombinieren. Das ISO-Format für Daten ist meist YYYY-MM-DD, was besonders praktisch ist, da Dateien so im Explorer automatisch chronologisch richtig sortiert werden.
Hier ist das Skript, das das Erstellungsdatum ganz vorne anstellt:
Datum-Voranstellen.ps1)PowerShell
foreach ($path in $args) {
# Basisdaten der Datei abrufen
$file = Get-Item -LiteralPath $path
if ($file -is [System.IO.FileInfo]) {
# Erstellungsdatum im ISO-Format abrufen (JJJJ-MM-TT)
$datePrefix = $file.CreationTime.ToString("yyyy-MM-dd")
# Prüfen, ob das Datum bereits vorne steht (verhindert doppeltes Umbenennen)
if ($file.Name -notlike "$datePrefix*") {
# Neuen Namen generieren: Datum + Unterstrich + alter Name
$newName = $datePrefix + "_" + $file.Name
# Umbenennen
Rename-Item -LiteralPath $path -NewName $newName -ErrorAction SilentlyContinue
}
}
}foreach ($path in $args) {
# Basisdaten der Datei abrufen
$file = Get-Item -LiteralPath $path
if ($file -is [System.IO.FileInfo]) {
# Erstellungsdatum im ISO-Format abrufen (JJJJ-MM-TT)
$datePrefix = $file.CreationTime.ToString("yyyy-MM-dd")
# Prüfen, ob das Datum bereits vorne steht (verhindert doppeltes Umbenennen)
if ($file.Name -notlike "$datePrefix*") {
# Neuen Namen generieren: Datum + Unterstrich + alter Name
$newName = $datePrefix + "_" + $file.Name
# Umbenennen
Rename-Item -LiteralPath $path -NewName $newName -ErrorAction SilentlyContinue
}
}
}$file.CreationTime: Greift auf das exakte Datum zu, an dem die Datei erstellt wurde.
.ToString("yyyy-MM-dd"): Formatiert das Datum in das ISO-Format (z. B. 2024-05-20).
"yyyy-MM-dd_HH-mm".Sicherheitsabfrage (-notlike): Das Skript prüft, ob der Dateiname bereits mit diesem Datum beginnt. Das verhindert, dass du bei versehentlichem mehrmaligem Ausführen Namen wie 2024-05-20_2024-05-20_Dokument.pdf erhältst.
_ als Trenner: Ich habe einen Unterstrich zwischen Datum und Name eingefügt, damit es lesbar bleibt.
Wie beim letzten Mal:
Win + R -> shell:sendto.
Neue Verknüpfung erstellen.
Ziel: powershell.exe -WindowStyle Hidden -File "C:\Pfad\Zu\Datum-Voranstellen.ps1".
Name: "Datum voranstellen".
Wenn du beide Skripte oft benutzt, kannst du sie im SendTo-Ordner auch in einen Unterordner schieben (z. B. einen Ordner namens "PowerTools" erstellen). Dann erscheint im Rechtsklick-Menü unter "Senden an" ein Untermenü, und dein Hauptmenü bleibt schön übersichtlich.
Soll ich dir zeigen, wie man das Skript anpasst, falls du statt des Erstellungsdatums lieber das Änderungsdatum (wann die Datei zuletzt bearbeitet wurde) verwenden möchtest?
Melde dich an, um beispielsweise Google-Apps zu verbinden und Bilder zu erstellen
Da Gemini kein Mensch ist und Fehler machen kann, auch bei Informationen über Personen, solltest du die Antworten überprüfen. Datenschutz und GeminiWird in einem neuen Fenster geöffnet